import MarkdownIt from "markdown-it";
import markdownItDeflist from "markdown-it-deflist";
import markdownItRuby from "markdown-it-ruby";
// import markdownItImsize from "markdown-it-imsize";

import highlightjs from "./highlightjs";
import markdownItMath from "./mk-parser/markdown-it-math";
import markdownItSpan from "./mk-parser/markdown-it-span";
import markdownItTableOfContents from "./mk-parser/markdown-it-table-of-contents";
import markdownItImplicitFigures from "./mk-parser/markdown-it-implicit-figures";
import markdownItTableContainer from "./mk-parser/markdown-it-table-container";
import markdownItLinkfoot from "./mk-parser/markdown-it-linkfoot";
import markdownItImageFlow from "./mk-parser/markdown-it-imageflow";
import markdownItLiReplacer from "./mk-parser/markdown-it-li";

export const markdownParser = new MarkdownIt({
    html: true,
    highlight: (str, lang) => {
        if (lang === undefined || lang === "") {
            lang = "bash";
        }
        // 加上custom则表示自定义样式，而非微信专属，避免被remove pre
        if (lang && highlightjs.getLanguage(lang)) {
            try {
                const formatted = highlightjs
                    .highlight(lang, str, true)
                    .value.replace(/\n/g, "<br/>") // 换行用br表示
                    .replace(/\s/g, "&nbsp;") // 用nbsp替换空格
                    .replace(/span&nbsp;/g, "span "); // span标签修复
                return `<pre class="custom"><code class="hljs">${formatted}</code></pre>`;
            } catch (e) {
                console.log(e);
            }
        }
        return `<pre class="custom"><code class="hljs">
            ${markdownParser.utils.escapeHtml(str)}</code></pre>`;
    },
});

markdownParser
    .use(markdownItSpan) // 在标题标签中添加span
    .use(markdownItTableContainer) // 在表格外部添加容器
    .use(markdownItMath) // 数学公式
    .use(markdownItLinkfoot) // 修改脚注
    .use(markdownItTableOfContents, {
        transformLink: () => "",
        includeLevel: [2, 3],
        markerPattern: /^\[toc\]/im,
    }) // TOC仅支持二级和三级标题
    .use(markdownItRuby) // 注音符号
    .use(markdownItImplicitFigures, { figcaption: true }) // 图示
    .use(markdownItDeflist) // 定义列表
    .use(markdownItLiReplacer) // li 标签中加入 p 标签
    .use(markdownItImageFlow); // 横屏移动插件
// .use(markdownItImsize);

/**
 * 插入元素
 * @param {string | Array<string>} tagName 子节点名称
 * @param {string | Array<string>} content 子节点内容（文本内容）
 * @param {HTMLElement} parent 父节点
 */
export function createElm(tagName, content, parent) {
    if (Array.isArray(tagName) && Array.isArray(content)) {
        tagName.forEach((tag, idx) => {
            const elm = document.createElement(tag);
            elm.textContent = content[idx] ? content[idx] : "";
            parent.appendChild(elm);
        });
    } else if (typeof tagName === "string" && typeof content === "string") {
        const elm = document.createElement(tagName);
        elm.textContent = content;
        parent.appendChild(elm);
    }
}
